/**
 * 该文件，封装 axios 的
 */

import axios from "axios";

// 引入 store
import store from "@/store";

// 由于该文件不是组件，所以 main.js 中通过给 app.config.globalProperties.$message 不能直接在该文件使用
// 引入 createDiscreteApi
import { createDiscreteApi } from "naive-ui";

// 调用 createDiscreteApi 得到 message 方法
const { message } = createDiscreteApi(["message"]);

// 创建 axios 的实例
const request = axios.create({
  // TODO: 后续这块可以通过 环境变量 来修改
  // baseURL: "http://119.91.129.10:3001",

  // 判断当前运行模式是否为 production 模式，做不同的配置
  // baseURL: import.meta.env.MODE === 'production' ? 'http://119.91.129.10:3001' : 'http://localhost:3001',
  baseURL: import.meta.env.VITE_BASEURL,
  // 超时时间的设置，单位是 ms
  timeout: 1000 * 10,
});

// 请求拦截
request.interceptors.request.use(
  (config) => {
    // 获取 token
    // 在组件中使用 this.$store === store
    const token = store.getters["app/token"];
    if (token) {
      // token 存在，就设置给headers
      config.headers.token = token;
    }

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截
request.interceptors.response.use(
  (response) => {
    // http状态码为 2xx 就会进入这个回调

    // 1. 解构出后端的响应数据
    const { data } = response;
    // 2. 判断 data.code 是否为 '200'
    if (data.code === "200") {
      // 请求成功 直接 return data 。.then 的回调函数的参数收到的就是这里的 data
      return data;
    } else {
      // 请求失败 直接 message 提示用户
      message.error(data.message || "网络异常，请稍后重试！");
      // 不希望代码走到 .then 直接抛出异常
      throw new Error(data.message || "网络异常，请稍后重试！");
    }
  },
  (error) => {
    // http状态码不为 2xx 就会进入这个回调
    // TODO: 后续根据不同的状态码做一些额外的逻辑处理。比如说：
    //      401 登录过期了。刷新页面重新登录。
    //      403 没有权限。提示用户去申请权限之类的。
    return Promise.reject(error);
  }
);

// 将 request 导出
export default request;
